/**
 * 
 */
package org.stars.util.reflect;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.MethodDescriptor;
import java.lang.reflect.Constructor;


/**
 * Utility to create objects from theirs classes.
 * 
 * @author Francesco Benincasa
 * @author Alessandro Svetina
 * 
 */
public class Helper {


	/*
	 * Costruttore per oggetti generici. @param <T> il tipo di classe @param
	 * clazz la classe da istanziare. @return
	 */
	public static <T> T makeObject(Class<T> clazz) {
		try {

			/*
			 * for (Constructor c: el) System.out.println("The class of "
			 * +c.toString());
			 */
			return clazz.getConstructor().newInstance();
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * Costruttore per i dao generici. La prima classe è la classe del Dao, la
	 * seconda quella degli entity entity bean che gestiscono
	 * 
	 * @param <T>
	 *            tipo di Dao
	 * @param <A>
	 *            tipo di Entity Bean
	 * @param clazz
	 *            la classe del dao
	 * @param class2
	 *            la classe dell'entity bean
	 * @return istanza dell'oggetto da istanziare
	 */
	@SuppressWarnings("unchecked")
	public static <T, A> T makeObject(Class<T> clazz, Class<A> class2) {
		try {
			Constructor<?>[] el = clazz.getConstructors();
			return (T) el[0].newInstance(class2);
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * Returns a PropertyDescriptor[] for the given Class.
	 * 
	 * @param <T>
	 * 
	 * @param c
	 *            The Class to retrieve PropertyDescriptors for.
	 * @return A PropertyDescriptor[] describing the Class.
	 * @throws Exception
	 *             if introspection failed.
	 */
	public static <T> MethodDescriptor[] methodDescriptors(Class<T> c)
			throws Exception {
		BeanInfo beanInfo;
		try {
			beanInfo = Introspector.getBeanInfo(c);

		} catch (IntrospectionException e) {
			Exception ex = new Exception("Bean introspection failed: "
					+ e.getMessage());
			throw ex;
		}

		return beanInfo.getMethodDescriptors();
	}

}

